りおんクロニクル


ローカルDB × クラウド同期(ハイブリッド構成)|SQLiteとクラウドDBをつなぐ実務ガイド【2026年版】

Home【2026年版】C# / .NET入門と実践ガイド|基礎・業務アプリ開発・SQLite連携まで体系的に解説

業務アプリの現場では、 「ローカルでサクサク動く」×「クラウドでデータ共有」 を両立したいケースが増えています。 そのときに最も現実的なのが、ローカルSQLite × クラウドDBのハイブリッド構成です。

この記事では、ローカルDBとクラウドDBを同期させるための 設計パターン・差分同期・衝突解決・オフライン対応・API設計を 実務目線で整理します。

この記事でわかること
・ローカルDB × クラウド同期の全体構成
・差分同期(UpdatedAt / Version)戦略
・Push/Pull同期のAPI設計
・衝突解決(Conflict Resolution)の考え方
・オフライン対応と再同期
・業務アプリ向けベストプラクティス

1. ローカルDB × クラウド同期の全体像

まずは、よくあるハイブリッド構成の全体像から。

■ 典型構成

クライアントは基本的にローカルSQLiteを参照し、 一定間隔または操作タイミングでAPI経由でクラウドDBと同期します。

2. 同期の基本コンセプト:Push と Pull

ローカルDBとクラウドDBの同期は、 Push(ローカル → クラウド)Pull(クラウド → ローカル) に分けて考えます。

■ Pull(クラウド → ローカル)

■ Push(ローカル → クラウド)

この2つを明確に分けて設計することで、 同期ロジックがシンプルになります。

3. 差分同期の設計(UpdatedAt / Version 戦略)

全件同期は非現実的なので、 差分だけを同期する仕組みが必要です。

■ UpdatedAt方式

CREATE TABLE Users (
    Id          TEXT PRIMARY KEY,
    Name        TEXT NOT NULL,
    Email       TEXT,
    UpdatedAt   TEXT NOT NULL
);

■ Pull APIの例

GET /api/users/sync?since=2026-04-01T00:00:00Z

■ Version方式

どちらでもよいですが、UpdatedAtの方が人間にとって分かりやすいです。

4. Push同期の設計(アウトボックスパターン)

ローカルでの変更をクラウドに送るときは、 「送信キュー(アウトボックス)」を持つと安定します。

■ ローカル側アウトボックステーブル例

CREATE TABLE SyncOutbox (
    Id          INTEGER PRIMARY KEY AUTOINCREMENT,
    EntityName  TEXT NOT NULL,
    EntityId    TEXT NOT NULL,
    Operation   TEXT NOT NULL, -- Insert / Update / Delete
    PayloadJson TEXT NOT NULL,
    CreatedAt   TEXT NOT NULL,
    SentAt      TEXT
);

アプリは、実データ更新と同時に SyncOutboxに「変更内容」を記録します。 ネットワークが復帰したタイミングで、 まとめてAPIに送信します。

■ Push APIの例

POST /api/users/sync
[
  {
    "Operation": "Update",
    "EntityId": "U001",
    "Name": "山田太郎",
    "Email": "taro@example.com",
    "UpdatedAt": "2026-04-05T10:00:00Z"
  }
]

5. 衝突解決(Conflict Resolution)の考え方

ローカルとクラウドで同じレコードが別々に更新されると、 「どちらを採用するか?」という問題が発生します。

■ よくある戦略

業務アプリでは、 「UpdatedAtが新しい方」+「重要データは要確認」 の組み合わせが現実的です。

■ サーバー側での判定イメージ

// 受信した更新 vs サーバー上の既存データ
if (incoming.UpdatedAt >= current.UpdatedAt)
{
    // 上書き
}
else
{
    // 衝突としてログに残す or 別テーブルに退避
}

6. オフライン対応と再同期

ローカルDB × クラウド同期の最大のメリットは、 オフラインでも業務が継続できることです。

■ オフライン時の動き

■ オンライン復帰時の流れ

  1. Push:SyncOutboxの未送信データをAPIに送信
  2. Pull:クラウド側の差分をローカルに反映
  3. SyncOutboxのSentAtを更新

この「Push → Pull」の順番を守ることで、 ローカルの変更がクラウドに反映されてから最新状態を取得できます。

7. API設計のポイント

同期用APIは、通常のCRUD APIとは少し設計が異なります。

■ Pull API

GET /api/users/sync?since=2026-04-01T00:00:00Z

■ Push API

POST /api/users/sync
[
  { "Operation": "Insert", ... },
  { "Operation": "Update", ... },
  { "Operation": "Delete", ... }
]

8. ID設計(GUID / サロゲートキー)

ローカルとクラウドで同じテーブルを扱う場合、 IDの重複を避ける必要があります。

■ GUID(文字列ID)

Id TEXT PRIMARY KEY

整数のオートインクリメントより、GUIDの方が同期には向いています。

9. 業務アプリ向けベストプラクティス

まとめ:ローカルDB × クラウド同期は“現場に強い”構成

「クラウドだけだと現場が不安」「ローカルだけだと共有できない」 そんな現場の悩みに対して、 ローカルDB × クラウド同期(ハイブリッド構成) は非常に強力な解決策になります。 この記事をベースに、あなたの業務アプリに最適な同期戦略を設計してみてください。

前のページ  次のページ